<script>
  // 给你一个长度固定的整数数组 arr，请你将该数组中出现的每个零都复写一遍，并将其余的元素向右平移。

  // 注意：请不要在超过该数组长度的位置写入元素。

  // 要求：请对输入的数组 就地 进行上述修改，不要从函数返回任何东西。

  //   输入：[1,0,2,3,0,4,5,0]
  //   输出：null
  //   解释：调用函数后，输入的数组将被修改为：[1,0,0,2,3,0,0,4]

  //   遍历统计零的个数及数据结束位置，
  //   想像成每个零都会入栈两次，当栈长度与数组一样长时，结束遍历。从栈顶依次弹出元素。

  //   一个指针代表数据位置(栈顶)，一个指针代表写入位置(原数组当前写入位置)

  /**
   * @param {number[]} arr
   * @return {void} Do not return anything, modify arr in-place instead.
   */
  // splice 也可以处理
  var duplicateZeros = function (arr) {
    const n = arr.length;
    let top = 0;
    let i = -1;
    while (top < n) {
      i++;
      if (arr[i] !== 0) {
        top++;
      } else {
        top += 2;
      }
    }
    let j = n - 1;
    if (top === n + 1) {
      arr[j] = 0;
      j--;
      i--;
    }
    while (j >= 0) {
      arr[j] = arr[i];
      j--;
      if (arr[i] === 0) {
        arr[j] = arr[i];
        j--;
      }
      i--;
    }
  };

  console.log(duplicateZeros([1, 0, 2, 3, 0, 4, 5, 0]));
</script>
